----本宏仅仅适用面板为1.54且带勾玉的情况,
----开宏的时机：到冰1秒就开，最迟火之前（开宏前需要自己叠至少5层勾玉）
----第13行括号内黑色字体的4和5修改成自己配置页面绑定了CapsLock键的键位（G502默认的是G4和G5键）

-------操作系统选择，如果是win10，就=1,否则=0
IsWindow10 = 1; 

ShenMu="lalt"  --自行修改标记神目键
Move="Tilde"  --自行修改强制移动键（"~"键位为"Tilde"）
MoveMouse=1  --自行修改强制移动后鼠标移动模式（0.移动后鼠标不恢复，1.移动后鼠标恢复到陨石落点）
BiaoJiMove=1  --自行修改标记神目后鼠标移动模式（0.标记后鼠标不恢复，1.标记后鼠标恢复到陨石落点）
---------------------------------------------------全局设置-----------------------------------------------
EnablePrimaryMouseButtonEvents (true)

H=96235
Xo=32767--人物中心X坐标
Yo=30700--人物中心Y坐标

X=0--陨石位置X坐标
Y=0--陨石位置Y坐标
ShenMuX=0--神目位置X坐标
ShenMuY=0--神目位置Y坐标
YunShiX=0--陨石相对位置X坐标
YunShiY=0--陨石相对位置Y坐标


function OnEvent(event, arg, family)    
    --OutputLogMessage("event = %s, arg = %s, family= %s\n", event, arg, family);

    --arg == 4 ，G402对应的是侧键的返回键，不同鼠标按键请自行调整
    if (event == "MOUSE_BUTTON_RELEASED" and (arg == 4 or arg == 5)) then --1为左键，2为中键，3为右键；4为侧键返回，5为侧键前进（G402的键位值）
        GoGoGo();
    end
end

--------按键设置开始--------
    --默认：电刑-左键，引导-右键，原力波-1，黑人-2，黑洞-3，陨石-4
    --电刑--
    function DianXing_Down()
        if (IsKeyLockOn("CapsLock")) then
            PressMouseButton(1);         --按键按下，鼠标键用 PressMouseButton(1) [里面的1为左键，3为右键]，键盘按键用 PressKey("3") [里面的3记得带"“]
        end
    end
    function DianXing_Up()
        ReleaseMouseButton(1);       --按键抬起，鼠标键用 PressMouseButton(1) [里面的1为左键，3为右键]，键盘按键用 ReleaseKey("3") [里面的3记得带"“]
    end

    --引导技能--
    function YinDao_Down()
        if (IsKeyLockOn("CapsLock")) then
            PressMouseButton(3);
        end
    end
    function YinDao_Up()
        ReleaseMouseButton(3);
    end

    --黑洞--
    function HeiDong_Down()
        if (IsKeyLockOn("CapsLock")) then
            PressKey("3");
        end
    end
    function HeiDong_Up()
        ReleaseKey("3");
    end

    --原力波--
    function YuanLiBo_Down()
        if (IsKeyLockOn("CapsLock")) then
            PressKey("1");
        end
    end
    function YuanLiBo_Up()
        ReleaseKey("1");
    end

    --陨石--
    function YunShi_Down()
        if (IsKeyLockOn("CapsLock")) then
            PressKey("4");
        end
    end
    function YunShi_Up()
        ReleaseKey("4");
    end

    --黑人--
    function HeiRen()
        if (IsKeyLockOn("CapsLock")) then
            PressAndReleaseKey("2");--按下并抬起
        end
    end

    --强制站立
    function QiangZhiZhanLi_Down()
        if (IsKeyLockOn("CapsLock")) then
            PressKey("rshift");
        end
    end
    function QiangZhiZhanLi_Up()
        ReleaseKey("rshift");
    end

    function GouYuDownUp()
        if (IsKeyLockOn("CapsLock")) then
            PressAndReleaseKey("1");--按下并抬起

        end
    end

--------按键设置结束--------

------------主程序------ 里面偷了不少发电刑，不建议乱改，否则会导致某次原力波打不出，或是陨石砸不下
    Time = 0;       --这个是用于测试宏的执行时间，不用理会

    function GoGoGo()
        
        ShiFang();          --释放按键避免意外
        BiaoJi_ShenMu=0--标记神目是否按下
	 ShenMu_ZhuangTai=0--标记神目状态
        while (IsKeyLockOn("CapsLock")) do
            Time = 0;
            Time_Elapsed = GetRunningTime();

            --第一颗陨石，黑洞砸神目
            HeiDong(2740, 0);      --1750+3250=5000ms

            YanChi(1600);       --站神目

            --第二颗陨石，黑洞奥元素
            HeiDong(3240, 1);      --1750+3250=5000ms      

            UseTime = GetRunningTime() - Time_Elapsed;--实际已经用时

            GouYu();        --20秒内保持勾玉，用1技能，不占抬手

            LeftTime = 32000 - (GetRunningTime() - Time_Elapsed);
            YanChi(LeftTime);

            Time_Elapsed = GetRunningTime() - Time_Elapsed;
            --输出用时，第1个数值为计划用时，第2个为补时前用时，第3数值为补时后实际用时，第4个为补差值（负数暂无法补）
            OutputLogMessage("Plan: %d ms, Use:%d ms, Elapsed: %d ms, Fix: %d ms \n ", Time - LeftTime, UseTime, Time_Elapsed, LeftTime);

            --PressAndReleaseKey("CapsLock");
        end     
    end

    function Test()
        ShiFang();          --释放按键避免意外
        
        Time = 0;
        Time_Elapsed = GetRunningTime();

        --第一颗陨石，黑洞砸神目
        HeiDong(3240, 0);      --1750+3250=5000ms 

        YanChi(2000);       --站神目

        --第二颗陨石，黑洞奥元素
        HeiDong(3240, 1);      --1750+3250=5000ms 

        UseTime = GetRunningTime() - Time_Elapsed;--实际已经用时

        LeftTime = 32000 - (GetRunningTime() - Time_Elapsed);

        Time_Elapsed = GetRunningTime() - Time_Elapsed;
        --输出用时，第1个数值为计划用时，第2个为补时前用时，第3数值为补时后实际用时，第4个为补差值（负数暂无法补）
        OutputLogMessage("Plan: %d ms, Use:%d ms, Elapsed: %d ms, Fix: %d ms \n ", Time - LeftTime, UseTime, Time_Elapsed, LeftTime);

        PressAndReleaseKey("CapsLock");
    end

    --勾玉保持，黑人期间用，就用1技能
    function GouYu()
        for i=1,32,1 do
            YanChi(600);
            GouYuDownUp()
        end
    end

    --黑洞砸
    function HeiDong(DXTime, IsHeiRen)
        QiangZhiZhanLi_Down();  --强制站立开始
	if (IsHeiRen == 0) then
	        DianXing_Down();
	        YanChi(900);
	        DianXing_Up();
	end

        YuanLiBo_Down();        --原力波，原力波之后立马按下黑洞，黑洞不会吃掉原力波的层数
        YanChi(50);
        YuanLiBo_Up();

        HeiDong_Down();         --黑洞，黑洞增伤以按下陨石为准，5000ms内按下陨石必然吃到黑洞增伤（最长当前测试得到是5400ms内按下陨石）
        YanChi(200)
        HeiDong_Up();
        
        DianXing_Down();
        YanChi(DXTime);         --满勾玉攻速下17帧(283ms)释放一次
        DianXing_Up();

        Yunshi(IsHeiRen);       --陨石和引导，固定1500ms

        QiangZhiZhanLi_Up();    --强制站立结束
    end

    --陨石落下+电刑+引导，固定组合，用时1500ms
    function Yunshi(IsHeiRen)        
        YunShi_Down();          --陨石
        YanChi(50);
        YunShi_Up();

	--只有在单黑人时丢完陨石打电刑
	if (IsHeiRen == 0) then
	        DianXing_Down();
	        YanChi(1050);           --电刑2hit+，有可能偷到一发
	        DianXing_Up();
	end

	--双黑人时踩神目
	if (IsHeiRen == 1) then
		CaiShenMu();
		YanChi(1100);	--1100-34
	end

        YinDao_Down();          --引导，如果引导吃不到伤害一般是能量不足无法释放引导
        YanChi(34);            --【1.75攻速下】
        if (IsHeiRen == 1) then
            HeiRen();           --黑人按下抬起，陨石按下后变身
        end
        YanChi(334);            --一共引导了400ms
        YinDao_Up();
	end

function YunShi_X()
	YunShiX=(Xo+(H+Y-Yo)*((Xo-ShenMuX)*H^2/(H+ShenMuY-Yo)^2)/H+H*(X-Xo)/(H+ShenMuY-Yo))--传送后相对陨石X坐标
end

function YunShi_Y()
	YunShiY=(Yo+(Yo-ShenMuY)*H/(H+ShenMuY-Yo)-(Yo-Y)*H/(H+ShenMuY-Yo))--传送后相对陨石Y坐标
end

--踩神目
function CaiShenMu()
        if IsKeyLockOn("CapsLock") then--判断传送是否标记,标记后才会执行下面的步骤
                if YunShiY>0 and YunShiY<60000 and YunShiX>0 and YunShiX<65535 and BiaoJi_ShenMu==1 and MoveMouse==1 then
                        MoveMouseTo(ShenMuX,ShenMuY)--鼠标移动到神目位置
                        YanChi(17)
                        PressAndReleaseKey(Move)
                        YanChi(17)
                        MoveMouseTo(YunShiX,YunShiY)--鼠标移动到传送后陨石位置
                elseif  BiaoJi_ShenMu==1 and MoveMouse==1 then
                        MoveMouseTo(ShenMuX,ShenMuY)--鼠标移动到神目位置
                        YanChi(17)
                        PressAndReleaseKey(Move)
                        YanChi(17)
			elseif BiaoJi_ShenMu==0 then
				YanChi(34)
			end
			BiaoJi_ShenMu=0
		end

end
   --释放按键
    function ShiFang()
        ReleaseKey("1", "2","3", "4");
        QiangZhiZhanLi_Up();
        ReleaseMouseButton(1);
        ReleaseMouseButton(3);
    end   

    --延迟算法，通过计算运行时间来消除不同机器之间的误差
    function YanChi(ShiJian)
        Time = Time + ShiJian;
        YanChi_KaiShi = GetRunningTime()
        while (IsKeyLockOn("CapsLock") and (GetRunningTime() - YanChi_KaiShi < ShiJian - IsWindow10))
        do
    		if IsModifierPressed(ShenMu)  and ShenMu_ZhuangTai==0 then--判断标记神目是否按下
			ShenMuX,ShenMuY=GetMousePosition()--标记神目位置
			BiaoJi_ShenMu=1
			ShenMu_ZhuangTai=1
		elseif not IsModifierPressed(ShenMu) and ShenMu_ZhuangTai==1 then--判断标记神目按下状态
			if BiaoJiMove==1 and ShenMu_ZhuangTai==1 then
				MoveMouseTo(Xo,Yo)--鼠标移动到人物中心位置
			end
			ShenMu_ZhuangTai=0
		end
		Sleep(1);
        end
    end